package cn.initcap.designpattern.pattern.behavioral.templatemethod;

/**
 * @author initcap
 * @date Created in 2018/9/23 AM9:03.
 */
public abstract class AbstractCourse {

    /**
     * 声明为final是不允许子类对这个方法进行覆盖,
     * 模版方法就是为了提供一个模版，这个模版不允许子类随意的进行更改。
     */
    protected final void makeCourse() {
        this.makeppt();
        this.makeVideo();
        if (needWriteArticle()) {
            this.writeArticle();
        }
        this.packageCourse();
    }

    final void makeppt() {
        System.out.println("制作PPT");
    }

    final void makeVideo() {
        System.out.println("制作视频");
    }

    final void writeArticle() {
        System.out.println("***编写手记***");
    }

    /**
     * 钩子方法
     *
     * @return true时代表需要编写手记
     */
    protected boolean needWriteArticle() {
        return false;
    }

    /**
     * 课程源码的实现
     */
    abstract void packageCourse();

}
